home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / DN114_3D.ZIP / DN3D_1.DOC < prev    next >
Text File  |  1996-02-03  |  25KB  |  515 lines

  1. =------------------------------[Intro to 3D Graphics Programming]--[Kiwidog]-=
  2.  
  3.  _____Greetings
  4.  
  5.  Hello everyone,
  6.  
  7.  As my first code article since joining the Hornet crew, I've decided to
  8.  write an introduction into 3D graphics coding.  Trixter informed me that
  9.  DemoNews has never had a 3D article, so it seemed like a good idea. :-)
  10.  
  11.  This will not be just one article - far from it.  In fact, it will take
  12.  quite a few articles to cover all the information I want to cover (after
  13.  finding out about space limitations on article size I'm allowed to write,
  14.  I've had to chop up the series into smaller pieces).  But expect a minimum
  15.  ten or so articles coming your way...
  16.  
  17.  This is the full version of the DemoNews 114 article, which means you've
  18.  got the supplement file (that's good, because it has example source, too :)
  19.  The source included is the same example, but in three different files,
  20.  depending on what language and compiler you use.
  21.     WC_EX1.C - Watcom C version (32-bit DOS extended)
  22.     BC_EX1.C - Borland C version
  23.     TP_EX1.PAS - Turbo Pascal version
  24.  
  25.  This series will assume you've never done 3D graphics (or "Vectors" as
  26.  the scene likes to call it) before.  I'm going to try this on a very basic
  27.  level, and if you're already familiar with the essentials, you might want
  28.  to hit PgDn a few times.  Eventually, I'll write about more complicated 3D
  29.  issues in later articles.  But let's take it one step at a time...
  30.  
  31.  _____What You Need To Know First
  32.  
  33.  I'm assuming you have a knowledge of basic algebra, i.e. early high school
  34.  level math.  If you've had some Trigonometry already, that will help out,
  35.  but I'll try to cover the basics of what you need from that as well.  But,
  36.  more important than any one particular requirement, you have to like math,
  37.  or at least a willingness to like it.
  38.  
  39.          MATH IS ONLY BORING IF YOU DON'T HAVE A USE FOR IT.
  40.  
  41.  Basically, 3D coding is not really about programming... it's almost entirely
  42.  about math.  The amount of time you spend thinking about what you're doing
  43.  is generally a lot longer than the time you actually spend pounding the keys
  44.  writing the code.
  45.  
  46.  If you don't think you like math, and you're a coder, chances are you
  47.  probably _DO_ like math and just don't know it. :-)  I'm serious... a lot
  48.  of times when you hate a subject in school, you don't really hate it, you
  49.  just think you hate it because you hate the way it's taught.  Once you get
  50.  down to finding a purpose for all that "useless" knowledge.... it becomes
  51.  a heck of a lot of fun.  So if you like math, and you like coding graphics,
  52.  you've come to the right place.  If you like coding graphics but don't like
  53.  math... give it a chance; you may find out something new about yourself. :-)
  54.  
  55.  _____What You Don't Need to Know First
  56.  
  57.  Okay, generally speaking, the chain of math courses taught in high school
  58.  and college (or their European equivalents, which I can't really speak for
  59.  but I can take a guess) goes something like this:
  60.  
  61.  1. Algebra   2. Geometry   3. Analytical Algebra  4. Trigonometry
  62.  5. Pre-Calculus   6. Calculus   7. Linear Algebra   8. Vector Geometry
  63.  9. Multivariable Calculus   10. Differential Equations   11. Even more
  64.  complicated issues that I haven't gotten to yet...
  65.  
  66.  You need to know up to #3 to make use of any of this.  #4 would be helpful,
  67.  although I'll cover a few things here in the beginning to get you going,
  68.  if you've never taken Trig before.
  69.  
  70.  Pre-Calc and Calc aren't directly needed for this series, although you'll
  71.  find it useful later on in life when you want to make really cool movements
  72.  for your vectors.  And if you know through #7, life is a breeze; you can
  73.  forget most of this beginning crap. :) Anything after that I'm not going to
  74.  cover by itself, but you'll find it helpful if you know it, as you try more
  75.  innovative ideas with your vector code.  But still, it's not necessary at
  76.  all for the little I'm going to be able to teach you. :)
  77.  
  78.  _____What Will Be Covered In This Series
  79.  
  80.  Whew, it's a whopper.  Here's the series layout as I'm planning it so far.
  81.  As you can tell, the first couple articles are for the _very_ beginners,
  82.  like the kind who know how to code, but have never even touched anything
  83.  with 3D before.  After the first few, it'll get more interesting though,
  84.  so bear with me (if you have some 3D experience already, you can forget
  85.  reading the first few articles; they won't do you any good).
  86.  
  87.  1. Basic Trig functions, 3D Coordinate to 2D Screen Projection.
  88.  2. 2D and 3D Rotations & Other Transformations.
  89.  3. Dot and Cross Products, Backface Removal and Lightsourcing.
  90.  4. Polygon Fills - Flat and Lambert
  91.  5. Polygon Fills - Gouraud and Phong
  92.  6. Polygon Fills - Affine Texture Mapping
  93.  7. Polygon Fills - Perspective Texture Mapping, Perspective Correction
  94.  8. Spherical and Cylindrical Coordinates
  95.  9. Polygon Fills - Bump Mapping
  96.  10. BSP Trees and Spacial Partitioning
  97.  11. Polygon Fills - Reflection Mapping
  98.  12. Alternative Camera Positioning and Motion
  99.  13. Path Management, Linear and Bezier Curve Movement
  100.  14. Basic Inverse Kinematics
  101.  15. (Unknown - I'm not sure how much further I can take it without risking
  102.       losing the few tricks I have up my sleeve for my future :)
  103.  
  104.  It's quite likely that the later articles will be split into separate
  105.  articles as well (I doubt I can fit both Gouraud and Phong, for example,
  106.  into one article).  So the numbers are probably going to get higher and
  107.  higher.  It will probably be around the time of NAID or afterward that
  108.  the series ends.
  109.  
  110.  Get ready for a crash course in 3D... :-)
  111.  
  112.  
  113.  _____Section One - Basic Trigonometric Functions
  114.  
  115.  
  116.  Okay, If you've taken Trig before, skip this section.  If you haven't,
  117.  you're probably thinking that this long title doesn't sound too friendly.
  118.  Don't worry, it sounds a whole lot worse than it is.
  119.  
  120.  The main principles of Trigonometry come from the first part of the name,
  121.  "Trigon", which pretty much means a triangle.  Everything in Trig is based
  122.  on a few functions which deal with triangles.  There are six of these
  123.  functions...
  124.  
  125.  Sine, Cosine, Tangent, Secant, Cosecant, and Cotangent
  126.  Abbreviated:  Sin, Cos, Tan, Sec, Csc, and Cot.
  127.  
  128.  ... but in fact, they all boil down to the first two, Sine and Cosine.
  129.  
  130.  Now I assume you're all familiar with functions, like [f(x) = 2x] and so
  131.  forth (BTW I'll enclose functions in [] on occasion throughout this doc).
  132.  Well the Trig functions are all functions using angles, for example
  133.  [f(x) = sin(x)]  or even  [f(x) = 2 sin(x) - 5 cos(x)], and so on.
  134.  In these cases, x is an angle, either in degrees or radians.  I'm going
  135.  to stick with degrees for this explanation, since radians are too complex
  136.  for me to discuss right now.
  137.  
  138.  Okay, so now you're thinking, "Great... Sine and Cosine are functions using
  139.  angles.  But what do they _DO_?"  Well, here's the rundown.
  140.  
  141.  Get out a piece of paper.  Go ahead, I'll wait.  Now on that piece of paper,
  142.  draw yourself a pair of X and Y coordinate axes, like you normally would for
  143.  a graph.  Make it big, so you give yourself lots of room.
  144.  
  145.  Now draw a circle around the origin.  Make it as good a circle as you can
  146.  sketch.  Now whatever size you drew your circle, assume that's a radius
  147.  of 1.  So where the circle hits your X and Y axes, label those points as
  148.  X=1 on the right, Y=1 on the top, X=-1 on the left, and Y=-1 on the bottom.
  149.  
  150.  Okay, with this circle, we need some angles.  Using your good ol' 360-degree
  151.  system, label those four points with their angles, where 0 degrees is facing
  152.  the right and they go counterclockwise.  So 0 is at the right, 90 is up,
  153.  180 is left, and 270 is down.
  154.  
  155.  Now knowing that's how the angles go, draw a line from the origin out to the
  156.  circle at about, oh, 60 degrees (up and to the right, more tall than wide).
  157.  At that point on the circle, draw a line STRAIGHT DOWN to the X axis.  What
  158.  you should have now is a triangle inside the circle, with one side on the
  159.  X axis, one going straight up, and one at a 60 degree angle.
  160.  
  161.  Okay, it's time for a little guessing game.  Assuming that the circle has
  162.  a radius of 1 like you drew it, how tall is that vertical side of the
  163.  triangle?  It's almost as tall as the circle, but not quite... more than
  164.  half the height of the circle, maybe around 3/4 the height, something like
  165.  that.
  166.  
  167.  What was your guess?  Probably somewhere between 0.7 and 0.9, I would think.
  168.  It should look about that tall.  Whatever your guess is, write it down, and
  169.  keep it handy... it's going to be very important.
  170.  
  171.  Now do the same thing for the bottom horizontal side of the triangle, the
  172.  one along the X axis.  How long is that from the looks of it?  It appears
  173.  around half the width of the circle, so you'd probably guess around 0.5 or
  174.  so.  Anyway, write that one down too.
  175.  
  176.  Okay, So you've got this triangle inside this circle, with the longest side
  177.  at an angle of 60 degrees and a length of 1 (the radius of the circle),
  178.  and two sides going straight vertical and horizontal, with lengths somewhere
  179.  near the numbers you guessed.
  180.  
  181.  I'm gonna pull out my calculator, which supports Trig functions.  Lemme
  182.  punch up the numbers....
  183.  
  184.     Sin(60) = 0.8660254
  185.     Cos(60) = 0.5000000
  186.  
  187.  Notice any correlation?  You should... they're the lengths of the sides you
  188.  were guessing! :-)  That, quite simply, is what the Sin and Cos functions
  189.  are... if you have a circle with radius 1, and a line at any angle from
  190.  the origin to the circle, then the Sine of that angle is the Y-component
  191.  (height) of that line, and the Cosine of the angle is the X-component
  192.  (width) of the line.
  193.  
  194.  Other examples?  Well now that you know what the Sin and Cos functions mean,
  195.  what are the Sin and Cos of 90 degrees?  Well let's see... that's the line
  196.  going straight up from the origin, along the Y axis.  The height is
  197.  the height of circle, exactly.  And the width... well, there is no width,
  198.  since it's not going left or right whatsoever.
  199.  
  200.  Sure enough,
  201.  
  202.     Sin(90) = 1.0000000
  203.     Cos(90) = 0.0000000
  204.  
  205.  Likewise, the trend continues.....
  206.  
  207.           Angle        Sine    Cosine
  208.           0        0    1
  209.           90        1    0
  210.           180             0    -1
  211.         270        -1    0
  212.  
  213.  Which demonstrates a very important point about these functions
  214.  
  215.     Fact: The Sine and Cosine functions will never go less than -1,
  216.           and never greater than 1.
  217.  
  218.  ... and that makes sense, considering the circle has a radius of 1.
  219.  (Terminology: The circle you drew is often called the "unit circle" by
  220.   math books and teacher-type people).
  221.  
  222.  Now by looking at the circle, you can see how the height changes less and
  223.  less as you approach Sin=1 or Sin=-1, and likewise the width changes less
  224.  and less as you approach Cos=1 or Cos=-1.  It turns out that the Sin and
  225.  Cos functions are not linear whatsoever... and because of that, calculating
  226.  them for any given angle is a real pain in the rear.  Sure, you have the
  227.  occasional angles like 90 and 180 which have 1s and 0s, or 30 and 60 which
  228.  have one of the components exactly 0.5, but most of the time you have values
  229.  that are not the nicest of numbers.
  230.  
  231.  For this reason, you often hear 3D coders referring to "Sine Tables", which
  232.  are precalculated tables holding the Sin and Cos values for every angle in
  233.  their system (in this example, a 360 degree system.  It turns out in coding
  234.  that a 256 degree system is much more convenient, for reasons you can
  235.  probably guess).  These do-it-once tables turn an otherwise painful
  236.  calculation into a simple memory look-up. :-)
  237.  
  238.  (BTW - earlier I mentioned in addition to Sin and Cos the Tan, Sec, Csc
  239.  and Cot functions... these can all be created from Sin and Cos by the
  240.  following:    Tan(x) = Sin(x)/Cos(x)
  241.         Sec(x) = 1/Cos(x)
  242.         Csc(x) = 1/Sin(x)
  243.         Cot(x) = Cos(x)/Sin(x) = 1/Tan(x)
  244.  Most of those aren't very useful in vector coding, with the exception of
  245.  Tangent... it will come in handy at times.  Everything else isn't too
  246.  important for now, but keep it on the back burner for future reference).
  247.  
  248.  Okay, so now you've learned what you need to know from Trig... that the
  249.  Sin and Cos functions can be used to find the X and Y parts of a line at
  250.  any given angle.  You just take the length of the line, multiply the Sin
  251.  or Cos (whichever you're looking for, Y or X respectively) by the line's
  252.  length, and wham you've got your result.  This will be used EXTENSIVELY
  253.  in the rest of the doc and in 3D in general, as almost everything depends
  254.  on these components.
  255.  
  256.  There is certainly a lot more to trigonometry, and entire books have been
  257.  dedicated to the subject.  My highly over-simplified version here should
  258.  hopefully be enough to get your foot in the door.  If you want more
  259.  complex and detailed info, I'd highly suggest a good math textbook covering
  260.  the subject (Trig is often grouped in with pre-calculus texts, incase you
  261.  have a difficult time finding a separate book).  But this should be good
  262.  enough for the time being. :)
  263.  
  264.  All set?  Then let's get out of this plane of thought (sorry, very bad pun)
  265.  and get into some three-space nitty gritty, starting with...
  266.  
  267.  
  268.  _____Section Two - The 3D Cartesian Coordinate System
  269.  
  270.  
  271.  Okay, you're undoubtedly already used to doing graphics in 2D using the X
  272.  and Y axes; it's what you've been doing in algebra all along.  Well using
  273.  X and Y is the 2D standard of the Cartesian coordinate system, and likewise,
  274.  we need to add another axis of depth for 3D - The Z axis.  But where does
  275.  this Z axis go?
  276.  
  277.  Well X and Y are perpendicular to each other in the 2D plane.  It's the same
  278.  as the plane of your screen, for example.  Well in 3D, we can get depth by
  279.  putting the Z axis perpendicular to that entire plane altogether, going
  280.  either into or out of your screen.
  281.  
  282.  A common term for a line or plane perpendicular to another plane is
  283.  "orthogonal".  That is, we want a Z axis that's orthogonal to the XY screen
  284.  plane.
  285.  
  286.  But in which direction?  It can either go into or out of the plane, so which
  287.  one is right?  Well this is really entirely by convention... the standard
  288.  way is to use a "right handed" orientation.  What's a right handed
  289.  orientation?  Okay, hold up your right hand in front of your face.  Point
  290.  your thumb toward your nose.  Now look at your fingers... they curl
  291.  counterclockwise.  This is the basis behind a right-handed system.  When you
  292.  have the XY plane, the two axes for X and Y are to the right and going up,
  293.  respectively.  So if you start your hand at the first axis, X, and curl your
  294.  right hand's fingers in the direction of the second axis, Y, your thumb
  295.  will point out toward your nose.
  296.  
  297.  So the Z axis goes out of the screen, toward you, by a right-handed system
  298.  (for the same reason, if you used the YX plane instead of the XY plane,
  299.  the curl would be in the opposite direction and Z would go into the screen
  300.  instead).
  301.  
  302.  Cheesy ASCII graph....
  303.  
  304.         Y
  305.         |
  306.         |
  307.         | Screen Plane
  308.         |
  309.         |
  310.             -------X
  311.            /
  312.           /
  313.          /
  314.         Z
  315.  
  316.  
  317.  The graph above is the way we're going to do it in this doc.  All 3D
  318.  Cartesian really is, is just the same coordinate system you're used to, but
  319.  with the added dimension so you can locate a point anywhere in space and
  320.  not just on a plane.  End of story (You might find later that other
  321.  coordinate systems, like spherical and cylindrical, can help out with some
  322.  routines... but I'll go over those in time).
  323.  
  324.  Short section, eh?  There's more, but not much. :-) Well, now with the 3D
  325.  system in your grasp, it's time to put it to use, and get some 3D points to
  326.  show up on-screen.
  327.  
  328.  
  329.  _____Section Three - Perspective Projection
  330.  
  331.  
  332.  Now we've got this nice XYZ spacial coordinate system... but how do we take
  333.  advantage of it and get some stuff on-screen from it?  In 2D, it was easy...
  334.  you just used the same X axis as in your coordinates, and the Y axis was the
  335.  same only flipped upside down (since as you know, in coding it's easier if
  336.  the Y axis goes down, for calculation reasons).  But how are we going to
  337.  take this Z thing into account and make things look right?
  338.  
  339.  The way we do it is by "Perspective Projection".  Perspective is a pretty
  340.  basic idea which you see continuously in your life.... Things further away
  341.  from you look smaller than things closer up.  Pretty obvious fact that you've
  342.  lived with throughout your existence. :)
  343.  
  344.  Well all we have to do is turn that simple principle into math...
  345.  
  346.  English way:    "Things further away from you look smaller than things
  347.         closer up."
  348.  
  349.  Math way:    "The projected size of any object in the eye is inversely
  350.         proportional to its distance from the eye".
  351.  
  352.  It's more "math-like", but still makes sense, right?  They both mean the
  353.  same thing more or less, but the second phrase is more easily turned into
  354.  equation form... the kind we can put into our code.
  355.  
  356.  Okay, by our ASCII graph of the coordinate system, your eye lies right along
  357.  our Z axis, staring down in the negative direction (the Z axis goes out of
  358.  your screen, and you're looking in).  So an object's, or point's, distance
  359.  from the eye is going to have a lot to do with the Z coordinate of that
  360.  point.
  361.  
  362.  So the first thing we need to settle is, if our eye (or in our case, the
  363.  video screen) is sitting somewhere along the Z axis.... where along the Z
  364.  axis is it?  In truth, this is entirely up to you... the screen is just
  365.  a "camera", and we're trying to find a convenient place for it to sit.
  366.  All we know is that it goes along the positive Z axis.
  367.  
  368.  It turns out for calculation reasons that a very effective place to put the
  369.  camera is at Z=256.  You'll see why in a minute... (and no, none of this
  370.  is carved in stone.  Cameras can go anywhere and view in any direction,
  371.  it's just that the math gets more complicated).
  372.  
  373.  Okay, now we've got the camera at (0,0,256) and pointing in the negative
  374.  direction.  That means that our Cartesian origin is exactly 256 units away
  375.  from us, right along our line of sight.  The next thing we need to make up
  376.  is a frame of reference for X and Y.... How big, visually, is a unit along
  377.  X or Y?  Well we can use any set of values we see fit, but just to make it
  378.  easier on the brain, we want to use something we're already used to...
  379.  something intuitive...
  380.  
  381.  How about 1 pixel?  It's easy to compute, since it's the same as your
  382.  screen plane.  Okay, so we know _somewhere_ viewable along this axis, X and
  383.  Y are going to mean 1 pixel units.
  384.  
  385.  But where along the Z axis?  If things get larger as they get closer and
  386.  smaller as they get further away, where's a good distance to say where the
  387.  unit/pixel plane sits?
  388.  
  389.  Heck, why not just use the Z=0 plane?  After all, we know the origin is
  390.  perfectly visible (256 units down the -Z axis) so the origin is easily in
  391.  reach, and probably will make it easy to calculate our perspective viewing.
  392.  
  393.  Okay, we've got all we need to set up some perspective equations.  Now let's
  394.  do some simple examples in our heads so we can find out where these
  395.  equations are coming from...
  396.  
  397.  In 320x200 resolution (you can use any resolution you want, really, but this
  398.  is just for demonstration), the center point of your screen is at (160,100).
  399.  Makes sense, and you're probably very used to this by now.  Well, we're
  400.  viewing along the -Z axis, so that's where our axis is going down.  Right
  401.  along the line of that pixel.  No up, no down, no left, no right.  That's it.
  402.  
  403.  Now we know that at Z=0, Every X and Y unit mean one pixel.  So where would
  404.  (5,5,0) be positioned?  Well, it's the same as our screen plane, so there's
  405.  no distance adjustments to do.  It's 5 to the right of the origin, so
  406.  ScrX=160+5 = 165.  And it's 5 above the origin, which is in the opposite
  407.  direction of our "screen plane" Y, so that's ScrY=100-5 = 95.  You've got
  408.  your projected point.
  409.  
  410.  So what to do with points not on Z=0?  Howsabout (5,5,128)?  Well if we
  411.  think about it, Z=0 is 256 units distance from the screen.  Well Z=128 is
  412.  256-128 = 128 units distance from the screen.  Exactly half of the distance.
  413.  
  414.  Half the distance?  That makes it twice the size! :-)  So instead of adding
  415.  5 to X and subtracting 5 from Y, you'd use 10 instead for each axis.  That
  416.  would give us screen coords (170,90) for this point.  Same 3D X and Y as in
  417.  the first example, but the fact that it's so much closer makes it look
  418.  further from the center of the screen... the essence of perspective. :)
  419.  
  420.  Now in general, our equations go something like this
  421.  
  422.     ScrX = ( Lens*X / Distance ) + CenterX
  423.     ScrY = CenterY - ( Lens*Y / Distance )
  424.  
  425.  I'll explain each piece.  First, ScrY _would_ be the same basic equation
  426.  as ScrX, except that we have to do the subtraction instead because Y goes
  427.  down onscreen, not up.  Anyway, we have a few variables here...
  428.  
  429.  ScrX and ScrY are the screen point of the 3D point we're trying to project.
  430.  I figure you guessed that one already. :-)
  431.  
  432.  Distance is the distance of the point from the eye.  As we discussed before,
  433.  this has a _direct_ correlation to the Z coordinate of our 3D point.  Now
  434.  since we're on the positive Z axis but viewing in the negative direction,
  435.  and we know that at Z=0 the distance is 256, then any point where Z > 0
  436.  will have a distance < 256.  Likewise, if Z < 0, the point will be further
  437.  away than the origin, and distance > 256.  This makes distance a very
  438.  simple value:
  439.  
  440.     Distance = (256-Z)
  441.  
  442.  Pretty easy, eh? :-)  Now, Lens is a multiplier used to give your projection
  443.  the right "field of view" that you want.  You can manipulate Lens to give
  444.  the projection a very narrow range of vision, or to give it the classic
  445.  "wall-eye" view as well.  But in general, a really messed-up field of view
  446.  will make people want to vomit.  It's not natural.
  447.  
  448.  So we want to set it to something that will "feel" natural.  Well, from our
  449.  calculations and the fact that we want a unit/pixel relationship at Z=0,
  450.  we can get our Lens factor immediately... 256.  It's also a nice multiplier,
  451.  as you can use bit-shifts to get it, instead of a costly MUL instruction.
  452.  
  453.  And finally, CenterX and CenterY are positive integers that match to the
  454.  center X and Y point onscreen; 160 and 100 in this case (the Center value
  455.  for any resolution is just the resolution/2, which makes sense).
  456.  
  457.  So, from there, our equations boil down to
  458.  
  459.     ScrX = ( 256*X / (256-Z) ) + 160
  460.     ScrY = 100 - ( 256*Y / (256-Z )
  461.  
  462.  The first thing you should recognize is that we don't need to calculate
  463.  (256-Z) twice.  Also, if you use fixed point, you can calculate the divide
  464.  only once as well, but that's for a later article (I'm not focusing on
  465.  optimizations in this one).  Anyway, let's work out one of our previous
  466.  examples using these equations and see if we get the same result.  How about
  467.  the (5,5,128) one...  let's see...
  468.  
  469.     Distance = 256-Z = 256-128 = 128
  470.  
  471.     ScrX = ( 256*X / 128 ) + 160
  472.          = ( 256*5 / 128 ) + 160
  473.          = 10 + 160
  474.          = 170
  475.  
  476.     ScrY = 100 - ( 256*Y / 128 )
  477.          = 100 - ( 256*5 / 128 )
  478.          = 100 - 10
  479.          = 90
  480.  
  481.  Yup, same answer!  And these equations go quite easily into code. :-)
  482.  
  483.  Now you'll find that using straight integer math with these equations will
  484.  work well at first, but there are added advantages to using fixed point
  485.  math as well.  If you're familiar with fixed point, you should have few
  486.  problems trying to adapt this to it, speeding things up in the process.
  487.  If you're not familiar with it, don't sweat it; I'll cover it in an
  488.  upcoming article.
  489.  
  490.  Well, looks like that's the end of this article... make sure to check out
  491.  the sample source in Pascal and C within this supplement, and try a few
  492.  experiments out on your own!  You'll want to get very familiar with
  493.  projection as we get into more advanced stuff later on... and since it's
  494.  at least a week until the next DemoNews, you've got the time, so take
  495.  advantage of it. :-)
  496.  
  497.  Next issue, it'll be time to start on our path to not just getting these
  498.  points up there, but getting them to move.  Straight movement left, right,
  499.  up, down, in and out is easy... you just add or subtract from X, Y, or Z.
  500.  But rotation, that's another story.
  501.  
  502.  Until next time,
  503.  
  504.  
  505.  Chris Hargrove
  506.  a.k.a. Kiwidog, of Terraformer & Hornet
  507.  Coding & Organization
  508.  email: <kiwidog@vt.edu>
  509.  
  510.  
  511.  
  512.  
  513.  
  514.  
  515.